iT邦幫忙

2024 iThome 鐵人賽

DAY 17
2
自我挑戰組

AI救我系列 第 17

Day 17 - 亥姆霍茲方程-平面波(2)動畫繪製in Python

  • 分享至 

  • xImage
  •  

今天來畫平面波的動畫吧!

不囉唆,直接看下面:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


#定義平面波
def plane_wave(A, k, r, w, t): #A震幅 k波頻 r向量 w角頻率 t時間
    phase = complex(0, np.dot(k, r)-w*t)
    #內積np.dot (dot product, cross product)
    #exponential使用負數complex 0為實部,後者為虛部
    return A*np.exp(phase)

#定義波三維方向波速
kx = 2*np.pi*2
kz = 2*np.pi*2 #朝z方向行進
k = np.array([kx, kz])

#定義繪圖範圍
D = 5 
N =151 #繪圖細緻度

x_list = [-D/2 +D*i/N for i in range(N)]
z_list = [-D/2 +D*j/N for j in range(N)]
z_2d, x_2d = np.meshgrid(z_list, x_list)
#np.meshgrid產生網格 製作平面

A = 1 #定義震幅
w = 2*np.pi #定義角頻率

#定義電場為2維的矩陣
E_field = np.zeros((N, N), dtype = complex) 



#定義動畫用的t時間範圍
t_list = [0.1*i for i in range(10)] #跑十個點

#定義畫圖區域
fig, ax = plt.subplots()

#定義動畫更新,將t帶入
def evolution(t):
    ax.clear() #將上一張圖清除
    #每個迴圈都會帶入x和z的數值,return R數值
    for i in range(N):
        for j in range(N):
            r = np.array([x_2d[i,j], z_2d[i,j]])
            E_field[i, j] = plane_wave(A, k, r, w, t)
            #定義電場,0改為t
    #取電場的實部
    E_real = E_field.real
    #畫圖使用contour (not plot因為plot只能有兩筆資料,三筆資料兩個變數以上就必須用contourf)
    
    ax.contourf(z_2d, x_2d, E_real, cmap = "gray", levels = 99) #cmap為等高線圖色階 levels等高線數 


#製作動畫
ani= animation.FuncAnimation(fig, evolution, t_list)
ani.save("Planewave_animation.gif")
plt.show()

得出動畫如下:
Planewave animation

這裡改動的內容有:

  1. 定義畫圖區域fig
  2. 給出動畫時間範圍t_list
  3. 將波的迴圈方程包到以時間為參數變化的迴圈下,定義為evolution(t),其中原本時間是0的部分,改為t,也就是方程會帶入時間參數
  4. 新增動畫製作和儲存部分

Matplotlib.animation的功能是不是越來越上手了呢?
大家可以練習看看!


上一篇
Day 16 - 亥姆霍茲方程-三維平面波in Python(1)
下一篇
Day 18 - 亥姆霍茲方程-球面波動畫in Python
系列文
AI救我31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言